/**
 * 闲时任务执行
 * @param {Function} task 任务
 * @param {Function} callback 回调函数
 */
function requestIdle(task, callback) {
    if (requestIdleCallback) {
        // window.requestIdleCallback() 方法插入一个函数，这个函数将在浏览器空闲时期被调用。
        requestIdleCallback((IdleDeadline) => {
            if (IdleDeadline.timeRemaining() > 0) {
                task()
                callback()
            } else {
                requestIdle()
            }
        })
    } else {
        let startTime = Date.now()
        // window.requestAnimationFrame() 方法会要求浏览器在下一次重绘之前，调用用户提供的回调函数。
        requestAnimationFrame(() => {
            if (Date.now() - startTime < 16.6) {
                task()
                callback()
            } else {
                requestIdle(task, callback)
            }
        })
    }
}


/**
 * 执行一个耗时任务: 耗时任务执行完后，会返回一个promise
 * @param {Function} task 任务
 */
function runTask(task) {
    return new Promise((resolve) => requestIdle(task, resolve))
}

module.exports = runTask